package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件复制---成块读写数据
 * 在方法int read(),int write()中传入数组参数，则为以数组为块，长度为数组长度为单位进行读写
 * 速度更快
 */

public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./image.png");
        FileOutputStream fos = new FileOutputStream("./image_cp2.png");
        int len;//用来记录每次读取到的数据长度

        //这儿，如果我想以10KB为单位读取数据，就定义数组长度为10kb,原始单位是字节byte
        //     所以10kb长度的数组应为1024*10。
        byte[] data = new byte[1024*10];
        while((len=fis.read(data))!=-1){
            /*
                成块写操作：
                void write(byte[] data)
                一次性将给定数组中所有字节写入到文件中

                void write(byte[] data,int offset,int len)
                一次性将给定数组data中从下标offset处开始的连续len个字节写出
             */
            //fos.write(data);
            //上句，会存在写出脏数据的情况，让文件变大一点
            //因为如果是38kb的文件，我们严格按照长度为10kb的data数组进行复制，读写到第二个是满10kb复制
            //但是第三个数组元素复制时，只有8kb是读到的，写的时候剩下2kb还是之前的数据，属于脏数据
            fos.write(data,0,len);
        }
        System.out.println("复制完成");
        fis.close();
        fos.close();

    }
}
